﻿#ifndef __LEMP_H__
#define __LEMP_H__

#include <string.h>
#include <stdint.h>



#define USE_MALLOC		// lemp_malloc 默认使用malloc



#define HASH_TABLE_SIZE		17		// 哈希表大小
#define	EVENT_NAME_LENGTH	32		// 事件名长度



// 事件回调函数调用次数
typedef	enum lemp_event_times_t
{
	LEMP_EVENT_TIMES_ONCE = 0,
	LEMP_EVENT_TIMES_LOOP
}lemp_event_times_t;


// 事件回调函数结点
typedef struct lemp_event_cb_t
{
	struct lemp_event_cb_t* next;
	lemp_event_times_t times;
	void (*callback)(void* args);
}lemp_event_cb_t;


// 事件结点
typedef struct lemp_event_t
{
	char name[EVENT_NAME_LENGTH];
	uint8_t name_len;
	uint32_t hash_code;
	lemp_event_cb_t* event_nodes;
	struct lemp_event_t* next;
}lemp_event_t;


// 事件处理句柄
typedef struct lemp_handle_t {
	void* table[HASH_TABLE_SIZE];
	uint32_t(*get_hash)(char* name, uint8_t len);
	uint32_t hash_table_size;
}lemp_handle_t;


#ifdef USE_MALLOC
#include <stdlib.h>
#define lemp_malloc malloc
#define lemp_free free
#endif // USE_MALLOC


/**
 *@brief 事件处理框架初始化
 *
 * @param hander
 * @return int
 */
int	lemp_init(lemp_handle_t* hander);

/**
 *@brief 事件回调函数注册
 *
 * @param hander 事件处理句柄
 * @param name 事件名
 * @param len 事件名长度
 * @param cb 	回调函数
 * @param times 回调次数
 * @return int 0 成功 -1 内存不足 -2 内存不足
 */
int lemp_event_cb_regester(lemp_handle_t* hander, char* name, uint8_t len, void* cb, lemp_event_times_t times);


/**
 *@brief 事件回调函数删除
 *
 * @param hander 事件处理句柄
 * @param name 事件名
 * @param len 事件名长度
 * @param cb
 * @return int 0 成功 -1 未找到事件
 */
int lemp_event_cb_delete(lemp_handle_t* hander, char* name, uint8_t len, void* cb);


/**
 *@brief 事件触发，注意调用完后自行回收参数内存
 *
 * @param hander 事件处理句柄
 * @param name 事件名
 * @param len 事件名长度
 * @param args 参数
 * @return int 0 成功 -1 未找到事件
 */
int lemp_event_emit(lemp_handle_t* hander, char* name, uint8_t len, void* args);







#endif // __LEMP_H__

